
$.extend(Date, {
    maximum: function(d1, d2) {
        if (!d1) {
            return d2;
        }

        if (!d2) {
            return d1;
        }

        return d1.getDate() > d2.getDate() ? d1 : d2;
    },

    minimum: function(d1, d2) {
        if (!d1) {
            return d2;
        }

        if (!d2) {
            return d1;
        }

        return d1.getDate() < d2.getDate() ? d1 : d2;
    },

    duration: {
        oneDay: 1000 * 60 * 60 * 24,
        oneWeek: 1000 * 60 * 60 * 24 * 7
    },

    texts: {
        '-2': 'two days ago',
        '-1': 'yesterday',
        '0': 'today'
    }
});

$.extend(Date.prototype, {
    toPrettyString: function() {
        var time = Math.floor(this.getDate() / Date.duration.oneDay);

        var today = Math.floor(new Date().getDate() / Date.duration.oneDay);
        var tomorrow = today + 1;
        var afterTomorrow = tomorrow + 1;
        var yesterday = today - 1;

        var text = null;

        if (yesterday <= time) {
            if (today <= time) {
                if (tomorrow <= time) {
                    if (afterTomorrow <= time) {
                        // Do nothing.
                    } else {
                        text = 'tomorrow';
                    }
                } else {
                    text = 'today';
                }
            } else {
                text = 'yesterday';
            }
        }

        if (text) {
            var h = this.getHours();
            var m = this.getMinutes();
            var pm = h > 12;

            if (h == 0) { h = 12; } else if (h > 12) { h -= 12; }
            text = text + ' at ' + h + ':' + (m < 10 ? '0' + m : m) + (pm ? 'pm' : 'am');
            return text;
        }

        return this.toString();
    }
});
